package com.xbh.Book.utils;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @program: JavaWebExer
 * @description: Druid(德鲁伊)数据库连接池管理
 * @author: 许宝华
 * @create: 2021-04-03 14:32
 */

public class JDBCUtils {
    //声明成员变量,数据库连接池提供一个就足够了
    private static DruidDataSource dataSource;
    private static ThreadLocal<Connection> conns=new ThreadLocal<>();
    //初始化数据路连接池对象
    static{
        try {
            //创建配置文件对象
            Properties properties=new Properties();
            //Druid连接池不能加载文件主动加载配置文件 需要指定文件
            //读取jdbc.properties属性配置文件
            InputStream inputStream = JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
            //从流中加载数据
            //导入配置文件
            properties.load(inputStream);
            //创建数据库连接池
            //通过工厂类获取连接池的对象
            dataSource= (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     *获取数据库连接池中的连接
     * @return 如果返回null，说明获取连接失败
     * @author 许宝华
     * @creed: Talk is cheap,show me the code
     * @date 2021/4/3 14:34
     */
    public static Connection getConnection(){
//        Connection conn=null;
//        try {
//            conn=dataSource.getConnection();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return conn;
        Connection conn=conns.get();
        if(conn==null){
            try {
                //如果连接为空，就从数据库连接池里边获取连接
                conn=dataSource.getConnection();
                //保存到ThreadLocal对象中，供后面的jdbc操作使用
                conns.set(conn);
                //设置为手动管理事务
                conn.setAutoCommit(false);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return conn;
    }
        /**
         * 提交事务，并关闭释放连接
         * @param conn
         * @return void
         * @author 许宝华
         * @creed: Talk is cheap,show me the code
         * @date 2021/4/3 14:36
         */
        public static void commitAndClose(){
            Connection connection = conns.get();
            if(connection!=null){//如果不等于null，说明之前使用过连接，操作过数据库
                try {
                    connection.commit();//提交事务
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        connection.close();//关闭连接
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }

                }
            }
            //一定要执行remove操作，否则就会出错，因为Tomcat服务器底层使用了线程池技术
            conns.remove();
        }
        /**
         * 回滚事务，并关闭释放连接
         * @param conn
         * @return void
         * @author 许宝华
         * @creed: Talk is cheap,show me the code
         * @date 2021/4/3 14:36
         */
        public static void rollbackAndClose(){
            Connection connection = conns.get();
            if(connection!=null){//如果不等于null，说明之前使用过连接，操作过数据库
                try {
                    connection.rollback();//回滚事务
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        connection.close();//关闭连接
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }

                }
            }
            //一定要执行remove操作，否则就会出错，因为Tomcat服务器底层使用了线程池技术
            conns.remove();
        }
//    /**
//     *关闭连接，放回数据库连接池
//     * @param conn
//     * @return void
//     * @author 许宝华
//     * @creed: Talk is cheap,show me the code
//     * @date 2021/4/3 14:36
//     */
//    public static void close(Connection conn){
//        if(conn!=null){
//            try {
//                conn.close();
//            } catch (SQLException e) {
//                e.printStackTrace();
//            }
//        }
//
//
//    }
}
